#include<bits/stdc++.h>
#define int long long 
using namespace std;

const int maxn=1e5+10;
const int p=998244353;
int arr[maxn], q[maxn];
int mx[maxn], mn[maxn];
int n,k,x;

int qmi(int a, int b){
	int res=1;
	while(b){
		if(b&1){
			res=res*a%p;
		}
		b>>=1;
		a=a*a%p;
	}
	return res;
}


int inv(int x){
	return qmi(x, p-2);
}

void solve(){
	cin>>n>>k>>x;
	for(int i=1;i<=n;i++){
		cin>>arr[i];
	}
	int hh=1, tt=0;
	// 先处理出最大值
	// 这里注意 q 里面存储的是下标
	for(int i=1;i<=n;i++){
		while(hh<=tt&&(q[hh]<i-k+1)){ // 头部离的太远了
			hh++;
		}
		// 检查队尾是否要删除
		while(hh<=tt&&arr[q[tt]]<=arr[i]){
			tt--;
		}
		q[++tt]=i;
		mx[i]=arr[q[hh]];
//		cout<<i<<' '<<mx[i]<<'\n';
	}
	
	// 然后处理最小值
	hh=1, tt=0;
	// 先处理出最大值
	// 这里注意 q 里面存储的是下标
	for(int i=1;i<=n;i++){
		while(hh<=tt&&(q[hh]<i-k+1)){ // 头部离的太远了
			hh++;
		}
		// 检查队尾是否要删除
		while(hh<=tt&&arr[q[tt]]>=arr[i]){
			tt--;
		}
		q[++tt]=i;
		mn[i]=arr[q[hh]];
//		cout<<i<<' '<<mn[i]<<'\n';
	}
	int cnt=0;
	for(int i=k;i<=n;i++){
		if(mx[i]-mn[i]<=x){
			cnt++;
		}
	}
	cout << cnt*inv(n-k+1)%p<<'\n';
}


signed main(){
	ios::sync_with_stdio(0), cin.tie(0),cout.tie(0);
	solve();
	return 0;
}
